﻿#include "Test_Singleton.h"
#include "gtest/gtest-spi.h"
#include "Singleton.h"


Test_Singleton::Test_Singleton(void)
{
}


Test_Singleton::~Test_Singleton(void)
{
}

// 여기 테스트에서만 사용될 클래스
class SingletonTestUse : public kat::Singleton<SingletonTestUse> {
public:
};

// 여기서는 두 가지 테스트를 함께 한다. 중복 생성 체크는 최초 한번만 가능하기 때문에.
TEST_F(Test_Singleton, createRepeatition_getInstance) {
  // Singleton 클래스의 getInstance 가 호출될 때 정확히 하나의 객체만을 리턴하는지
  // 테스트 한다.
  SingletonTestUse* testObjectPtr = SingletonTestUse::getInstancePtr();
  SingletonTestUse& testObject = SingletonTestUse::getInstance();
  EXPECT_NE((SingletonTestUse*)NULL, testObjectPtr);
  EXPECT_EQ(testObjectPtr, SingletonTestUse::getInstancePtr());
  EXPECT_EQ(testObjectPtr, &testObject);

  // 중복되어 생성이 되는지 확인한다.
  // 이와 같이 사용하면 안 되지만, 테스트를 위해서 강제 생성하도록 한다.
  // 현재 이미 생성이 되어 있는 단계이고,
  // 이 때 생성자를 직접 호출하게 되면 중복 생성하게 된다.
  // 그리고 예외는 일단 기본 예외가 throw 되도록 하자(나중에 변경)
  ASSERT_THROW(SingletonTestUse createRepeat, kat::Kat_Exception);
  // 물론 이 경우에는 예외가 호출이 되면 안된다.
  ASSERT_NO_THROW(
      SingletonTestUse& createRepeat = SingletonTestUse::getInstance());
}
